找传奇、传世资源到传世资源站!

C#操作shapfile

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

读取shapfile文件
from clipboardusing System;using System.Collections;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace EsriShpReader{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } ArrayList polygons = new ArrayList();//面集合 ArrayList polylines = new ArrayList();//线集合 ArrayList points = new ArrayList();//点集合 Pen pen = new Pen(Color.Black, 1);//定义画笔 int ShapeType;//shp文件类型 int count;//计数 double xmin, ymin, xmax, ymax; double n1, n2;//x,y轴放大倍数 private void Form1_Load(object sender, EventArgs e) { } private void button_open_Click(object sender, EventArgs e) { string shpfilepath = ""; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "shapefiles(*.shp)|*.shp|All files(*.*)|*.*";//打开文件路径 if (openFileDialog1.ShowDialog() == DialogResult.OK) { shpfilepath = openFileDialog1.FileName; BinaryReader br = new BinaryReader(openFileDialog1.OpenFile()); //读取文件过程 br.ReadBytes(24); int FileLength = br.ReadInt32();//<0代表数据长度未知 int FileBanben = br.ReadInt32(); ShapeType = br.ReadInt32(); xmin = br.ReadDouble(); ymax = -1 * br.ReadDouble(); xmax = br.ReadDouble(); ymin = -1 * br.ReadDouble(); double width = xmax - xmin; double height = ymax - ymin; n1 = (float)(this.panel1.Width * 0.9 / width);//x轴放大倍数 n2 = (float)(this.panel1.Height * 0.9 / height);//y轴放大倍数 br.ReadBytes(32); switch (ShapeType) { case 1: points.Clear(); while (br.PeekChar() != -1) { Point point = new Point(); uint RecordNum = br.ReadUInt32(); int DataLength = br.ReadInt32(); //读取第i个记录 br.ReadInt32(); point.X = br.ReadDouble(); point.Y = -1 * br.ReadDouble(); points.Add(point); } StreamWriter sw = new StreamWriter("point.txt"); foreach (Point p in points) { sw.WriteLine("{0},{1},{2} ", p.X, -1 * p.Y, 0); } sw.Close(); break; case 3: polylines.Clear(); while (br.PeekChar() != -1) { Polyline polyline = new Polyline(); polyline.Box = new double[4]; polyline.Parts = new ArrayList(); polyline.Points = new ArrayList(); uint RecordNum = br.ReadUInt32(); int DataLength = br.ReadInt32(); //读取第i个记录 br.ReadInt32(); polyline.Box[0] = br.ReadDouble(); polyline.Box[1] = br.ReadDouble(); polyline.Box[2] = br.ReadDouble(); polyline.Box[3] = br.ReadDouble(); polyline.NumParts = br.ReadInt32(); polyline.NumPoints = br.ReadInt32(); for (int i = 0; i < polyline.NumParts; i ) { int parts = new int(); parts = br.ReadInt32(); polyline.Parts.Add(parts); } for (int j = 0; j < polyline.NumPoints; j ) { Point pointtemp = new Point(); pointtemp.X = br.ReadDouble(); pointtemp.Y = -1 * br.ReadDouble(); polyline.Points.Add(pointtemp); } polylines.Add(polyline); } StreamWriter sw2 = new StreamWriter("line.txt"); count = 1; foreach (Polyline p in polylines) { for (int i = 0; i < p.NumParts; i ) { int startpoint; int endpoint; if (i == p.NumParts - 1) { startpoint = (int)p.Parts[i]; endpoint = p.NumPoints; } else { startpoint = (int)p.Parts[i]; endpoint = (int)p.Parts[i 1]; } sw2.WriteLine("线" count.ToString() ":"); for (int k = 0, j = startpoint; j < endpoint; j , k ) { Point ps = (Point)p.Points[j]; sw2.WriteLine(" {0},{1},{2} ", ps.X, -1 * ps.Y, 0); } count ; } } sw2.Close(); break; case 5: polygons.Clear(); while (br.PeekChar() != -1) { Polygon polygon = new Polygon(); polygon.Parts = new ArrayList(); polygon.Points = new ArrayList(); uint RecordNum = br.ReadUInt32(); int DataLength = br.ReadInt32(); //读取第i个记录 int m = br.ReadInt32(); for (int i = 0; i < 4; i ) { polygon.Box[i] = br.ReadDouble(); } polygon.NumParts = br.ReadInt32(); polygon.NumPoints = br.ReadInt32(); for (int j = 0; j < polygon.NumParts; j ) { int parts = new int(); parts = br.ReadInt32(); polygon.Parts.Add(parts); } for (int j = 0; j < polygon.NumPoints; j ) { Point pointtemp = new Point(); pointtemp.X = br.ReadDouble(); pointtemp.Y = -1 * br.ReadDouble(); polygon.Points.Add(pointtemp); } polygons.Add(polygon); } StreamWriter sw1 = new StreamWriter("polygon.txt"); count = 1; foreach (Polygon p in polygons) { for (int i = 0; i < p.NumParts; i ) { int startpoint; int endpoint; if (i == p.NumParts - 1) { startpoint = (int)p.Parts[i]; endpoint = p.NumPoints; } else { startpoint = (int)p.Parts[i]; endpoint = (int)p.Parts[i 1]; } sw1.WriteLine("多边形" count.ToString() ":"); for (int k = 0, j = startpoint; j < endpoint; j , k ) { Point ps = (Point)p.Points[j]; sw1.WriteLine(" {0},{1},{2} ", ps.X, -1 * ps.Y, 0); } count ; } } sw1.Close(); break; } } } private void button_updata_Click(object sender, EventArgs e) { double width = xmax - xmin;//图像宽 double height = ymax - ymin;//图像高 n1 = (float)(this.panel1.Width * 0.9 / width);//x轴放大倍数 n2 = (float)(this.panel1.Height * 0.9 / height);//y轴放大倍数 this.panel1.Refresh(); } private void panel1_Paint(object sender, PaintEventArgs e) { PointF[] point; switch (ShapeType) { case 1://点类型 foreach (Point p in points) { PointF pp = new PointF(); pp.X = (float)(10 (p.X - xmin) * n1); pp.Y = (float)(10 (p.Y - ymin) * n2); e.Graphics.DrawEllipse(pen, pp.X, pp.Y, 1.5f, 1.5f); } break; case 3://线类型 foreach (Polyline p in polylines) { for (int i = 0; i < p.NumParts; i ) { int startpoint; int endpoint; point = null; if (i == p.NumParts - 1) { startpoint = (int)p.Parts[i]; endpoint = p.NumPoints; } else { startpoint = (int)p.Parts[i]; endpoint = (int)p.Parts[i 1]; } point = new PointF[endpoint - startpoint]; for (int k = 0, j = startpoint; j < endpoint; j , k ) { Point ps = (Point)p.Points[j]; point[k].X = (float)(10 (ps.X - xmin) * n1); point[k].Y = (float)(10 (ps.Y - ymin) * n2); } e.Graphics.DrawLines(pen, point); } } break; case 5://面类型 foreach (Polygon p in polygons) { for (int i = 0; i < p.NumParts; i ) { int startpoint; int endpoint; point = null; if (i == p.NumParts - 1) { startpoint = (int)p.Parts[i]; endpoint = p.NumPoints; } else { startpoint = (int)p.Parts[i]; endpoint = (int)p.Parts[i 1]; } point = new PointF[endpoint - startpoint]; for (int k = 0, j = startpoint; j < endpoint; j , k ) { Point ps = (Point)p.Points[j]; point[k].X = (float)(10 (ps.X - xmin) * n1); point[k].Y = (float)(10 (ps.Y - ymin) * n2); } e.Graphics.DrawPolygon(pen, point); } } break; } // PointF[] point; switch (ShapeType) { case 1://点类型 foreach (Point p in points) { PointF pp = new PointF(); pp.X = (float)(10 (p.X - xmin) * n1); pp.Y = (float)(10 (p.Y - ymin) * n2); e.Graphics.DrawEllipse(pen, pp.X, pp.Y, 1.5f, 1.5f); } break; case 3://线类型 foreach (Polyline p in polylines) { for (int i = 0; i < p.NumParts; i ) { int startpoint; int endpoint; point = null; if (i == p.NumParts - 1) { startpoint = (int)p.Parts[i]; endpoint = p.NumPoints; } else { startpoint = (int)p.Parts[i]; endpoint = (int)p.Parts[i 1]; } point = new PointF[endpoint - startpoint]; for (int k = 0, j = startpoint; j < endpoint; j , k ) { Point ps = (Point)p.Points[j]; point[k].X = (float)(10 (ps.X - xmin) * n1); point[k].Y = (float)(10 (ps.Y - ymin) * n2); } e.Graphics.DrawLines(pen, point); } } break; case 5://面类型 foreach (Polygon p in polygons) { for (int i = 0; i < p.NumParts; i ) { int startpoint; int endpoint; point = null; if (i == p.NumParts - 1) { startpoint = (int)p.Parts[i]; endpoint = p.NumPoints; } else { startpoint = (int)p.Parts[i]; endpoint = (int)p.Parts[i 1]; } point = new PointF[endpoint - startpoint]; for (int k = 0, j = startpoint; j < endpoint; j , k ) { Point ps = (Point)p.Points[j]; point[k].X = (float)(10 (ps.X - xmin) * n1); point[k].Y = (float)(10 (ps.Y - ymin) * n2); } e.Graphics.DrawPolygon(pen, point); } } break; } } }}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复